home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Games / reve / rev_iycp.c < prev    next >
C/C++ Source or Header  |  1995-05-03  |  14KB  |  432 lines

  1.  
  2. /*  @(#)rev_iycp.c 1.7 91/11/07
  3.  *
  4.  *  Copyright (C) 1990, 1991 - Yves Gallot - all rights reserved.
  5.  *
  6.  *  Permission is granted to copy this source, for redistribution
  7.  *  in source form only, provided the news headers in "substantially
  8.  *  unaltered format" are retained, the introductory messages are not
  9.  *  removed, and no monies are exchanged.
  10.  *
  11.  *  Permission is also granted to copy this source, without the
  12.  *  news headers, for the purposes of making an executable copy by
  13.  *  means of compilation, provided that such copy will not be used
  14.  *  for the purposes of competition in any othello tournaments, without
  15.  *  prior permission from the authors.
  16.  *
  17.  *  No responsibility is taken for any errors on inaccuracies inherent
  18.  *  either to the comments or the code of this program, but if reported
  19.  *  (see README file), then an attempt will be made to fix them.
  20.  */
  21.  
  22. #include "reve.h"
  23.  
  24. extern int damier[NIVEAUMAX][64] ;
  25. extern int tacouleur, macouleur ;
  26. extern int vp0, vo0 ;
  27.  
  28. /*  Functions used by the "fast" alpha-beta pruning.
  29.  *  - JePeuxJouer( niv ) and TuPeuxJouer( niv ) :
  30.  *    Test if I Can Play or You Can Play on the Board number niv ( which is
  31.  *    current board at depth niv ). "I" is for macouleur value ( my color )
  32.  *    and "You" for tacouleur value ( your color ). Return TRUE or FALSE.
  33.  *    If TRUE, put JPJ on every squares where I Can Play, or TPJ on every
  34.  *    squares where You Can Play.
  35.  *  - JeJoueen( x, y, niv ) and TuJouesen( x, y, niv ) :
  36.  *    I Play square (x, y) on Board number niv and You Play square (x, y)
  37.  *    on Board number niv. It puts piece color macouleur or tacouleur and
  38.  *    returns pieces that must be.
  39.  */
  40.  
  41. int
  42. jepeuxjouer(niv)
  43. int niv ;
  44. {
  45.   register int *d ;
  46.   register int x, y, posx, posy, pos8x, poscr, flag ;
  47.  
  48.   d = damier[niv] ;
  49.   flag = FALSE ;
  50.   vp0 = 0 ;
  51.  
  52.   for (posx = 0; posx < 8; posx++)
  53.     {
  54.       pos8x = posx << 3 ;
  55.       for (posy = 0; posy < 8; posy++)
  56.         {
  57.           poscr = pos8x + posy;  
  58.           if  ((d[poscr] == TPJ) || (d[poscr] == JPJ)) d[poscr] = FREE ;
  59.           if (d[poscr] == FREE)
  60.             {
  61.  
  62.               for (x = posx + 1;
  63.                    (x < 7) && (d[(x << 3) + posy] == tacouleur);
  64.                    x++) continue ;
  65.               if ((x != posx + 1) && (d[(x << 3) + posy] == macouleur))
  66.                 {
  67.                   flag = TRUE ;
  68.                   d[poscr] = JPJ ;
  69.                   vp0++ ;
  70.                   goto endloopj ;
  71.                 } 
  72.  
  73.               for (x = posx - 1;
  74.                    (x > 0) && (d[(x << 3) + posy] == tacouleur);
  75.                    x--) continue ;
  76.               if ((x != posx - 1) && (d[(x << 3) + posy] == macouleur))
  77.                 {
  78.                   flag = TRUE ;
  79.                   d[poscr] = JPJ ;
  80.                   vp0++ ;
  81.                   goto endloopj ;
  82.                 } 
  83.  
  84.               for (y = posy + 1;
  85.                    (y < 7) && (d[pos8x + y] == tacouleur);
  86.                    y++) continue ;
  87.               if ((y != posy + 1) && (d[pos8x + y] == macouleur))
  88.                 {
  89.                   flag = TRUE ;
  90.                   d[poscr] = JPJ ;
  91.                   vp0++ ;
  92.                   goto endloopj ;
  93.                 } 
  94.  
  95.               for (y = posy - 1;
  96.                    (y > 0) && (d[pos8x + y] == tacouleur);
  97.                    y--) continue ;
  98.               if ((y != posy - 1) && (d[pos8x + y] == macouleur))
  99.                 {
  100.                   flag = TRUE ;
  101.                   d[poscr] = JPJ ;
  102.                   vp0++ ;
  103.                   goto endloopj ;
  104.                 } 
  105.  
  106.               for (x = posx + 1,  y = posy + 1; 
  107.                    (x < 7) && (y < 7) && (d[(x << 3) + y] == tacouleur);
  108.                    x++, y++) continue ;
  109.               if ((x != posx + 1) && (d[(x << 3) + y] == macouleur))
  110.                 {
  111.                   flag = TRUE ;
  112.                   d[poscr] = JPJ ;
  113.                   vp0++ ;
  114.                   goto endloopj ;
  115.                 }
  116.  
  117.               for (x = posx - 1,  y = posy + 1; 
  118.                    (x > 0) && (y < 7) && (d[(x << 3) + y] == tacouleur);
  119.                    x--, y++) continue ;
  120.               if ((x != posx - 1) && (d[(x << 3) + y] == macouleur))
  121.                 {
  122.                   flag = TRUE ;
  123.                   d[poscr] = JPJ ;
  124.                   vp0++ ;
  125.                   goto endloopj ;
  126.                 }
  127.  
  128.               for (x = posx + 1,  y = posy - 1; 
  129.                    (x < 7) && (y > 0) && (d[(x << 3) + y] == tacouleur);
  130.                    x++, y--) continue ;
  131.               if ((x != posx + 1) && (d[(x << 3) + y] == macouleur))
  132.                 {
  133.                   flag = TRUE ;
  134.                   d[poscr] = JPJ ;
  135.                   vp0++ ;
  136.                   goto endloopj ;
  137.                 }
  138.  
  139.               for (x = posx - 1,  y = posy - 1; 
  140.                    (x > 0) && (y > 0) && (d[(x << 3) + y] == tacouleur);
  141.                    x--, y--) continue ;
  142.               if ((x != posx - 1) && (d[(x << 3) + y] == macouleur))
  143.                 {
  144.                   flag = TRUE ;
  145.                   d[poscr] = JPJ ;
  146.                   vp0++ ;
  147.                 }
  148. endloopj: ; 
  149.             }
  150.         }
  151.     }
  152.   return flag ;
  153. }
  154.  
  155.  
  156. int
  157. jejoueen(posx, posy, niv)
  158. int posx, posy, niv ;
  159. {
  160.   register int *d ;
  161.   register int x, y, pos8x ;
  162.  
  163.   pos8x = posx << 3 ;
  164.  
  165.   d = damier[niv] ;
  166.  
  167.   d[pos8x + posy] = macouleur ;
  168.  
  169.   for (x = posx + 1;
  170.        (x < 7) && (d[(x << 3) + posy] == tacouleur); x++) continue ;
  171.   if ((x != posx + 1) && (d[(x << 3) + posy] == macouleur))
  172.     {
  173.       for (x = posx + 1; d[(x << 3) + posy] == tacouleur; x++)
  174.         d[(x << 3) + posy] = macouleur ;
  175.     }
  176.  
  177.   for (x = posx - 1;
  178.        (x > 0) && (d[(x << 3) + posy] == tacouleur); x--) continue ;
  179.   if ((x != posx - 1) && (d[(x << 3) + posy] == macouleur))
  180.     {
  181.       for (x = posx - 1; d[(x << 3) + posy] == tacouleur; x--)
  182.         d[(x << 3) + posy] = macouleur ;
  183.     }
  184.  
  185.   for (y = posy + 1;
  186.        (y < 7) && (d[pos8x + y] == tacouleur); y++) continue ;
  187.   if ((y != posy + 1) && (d[pos8x + y] == macouleur))
  188.     {
  189.       for (y = posy + 1; d[pos8x + y] == tacouleur; y++)
  190.         d[pos8x + y] = macouleur ;
  191.     }
  192.  
  193.   for (y = posy - 1;
  194.        (y > 0) && (d[pos8x + y] == tacouleur); y--) continue ;
  195.   if ((y != posy - 1) && (d[pos8x + y] == macouleur))
  196.     {
  197.       for (y = posy - 1; d[pos8x + y] == tacouleur; y--)
  198.         d[pos8x + y] = macouleur ;
  199.     }
  200.  
  201.   for (x = posx + 1, y = posy + 1;
  202.        (x < 7) && (y < 7) && (d[(x << 3) + y] == tacouleur);
  203.        x++, y++) continue ;
  204.   if ((x != posx + 1) && (d[(x << 3) + y] == macouleur))
  205.     {
  206.       for (x = posx + 1, y = posy + 1; d[(x << 3) + y] == tacouleur; x++, y++)
  207.         d[(x << 3) + y] = macouleur ;
  208.     }
  209.  
  210.   for (x = posx - 1, y = posy + 1;
  211.        (x > 0) && (y < 7) && (d[(x << 3) + y] == tacouleur);
  212.        x--, y++) continue ;
  213.   if ((x != posx - 1) && (d[(x << 3) + y] == macouleur))
  214.     {
  215.       for (x = posx - 1, y = posy + 1; d[(x << 3) + y] == tacouleur; x--, y++)
  216.         d[(x << 3) + y] = macouleur ;
  217.     }
  218.  
  219.   for (x = posx + 1, y = posy - 1;
  220.        (x < 7) && (y > 0) && (d[(x << 3) + y] == tacouleur);
  221.        x++, y--) continue ;
  222.   if ((x != posx + 1) && (d[(x << 3) + y] == macouleur))
  223.     {
  224.       for (x = posx + 1, y = posy - 1; d[(x << 3) + y] == tacouleur; x++, y--)
  225.         d[(x << 3) + y] = macouleur ;
  226.     }
  227.  
  228.   for (x = posx - 1, y = posy - 1;
  229.        (x > 0) && (y > 0) && (d[(x << 3) + y] == tacouleur);
  230.        x--, y--) continue ;
  231.   if ((x != posx - 1) && (d[(x << 3) + y] == macouleur))
  232.     {
  233.       for (x = posx - 1, y = posy - 1; d[(x << 3) + y] == tacouleur; x--, y--)
  234.         d[(x << 3) + y] = macouleur ;
  235.     }
  236. }
  237.  
  238.  
  239. int
  240. tupeuxjouer(niv)
  241. int niv ;
  242. {
  243.   register int *d ;
  244.   register int x, y, posx, posy, pos8x, poscr, flag ;
  245.  
  246.   d = damier[niv] ;
  247.   flag = FALSE ;
  248.   vo0 = 0 ;
  249.  
  250.   for (posx = 0; posx < 8; posx++)
  251.     {
  252.       pos8x = posx << 3 ;
  253.       for (posy = 0; posy < 8; posy++)
  254.         {
  255.           poscr = pos8x + posy ;
  256.           if ((d[poscr] == TPJ) || (d[poscr] == JPJ)) d[poscr] = FREE ;
  257.           if (d[poscr] == FREE)
  258.             {
  259.               for (x = posx + 1;
  260.                    (x < 7) && (d[(x << 3) + posy] == macouleur);
  261.                    x++) continue ;
  262.               if ((x != posx + 1) && (d[(x << 3) + posy] == tacouleur))
  263.                 {
  264.                   flag = TRUE ;
  265.                   d[poscr] = TPJ ;
  266.                   vo0++ ;
  267.                   goto endloopt ;
  268.                 } 
  269.  
  270.               for (x = posx - 1;
  271.                    (x > 0) && (d[(x << 3) + posy] == macouleur) ;
  272.                    x--) continue ;
  273.               if ((x != posx - 1) && (d[(x << 3) + posy] == tacouleur))
  274.                 {
  275.                   flag = TRUE ;
  276.                   d[poscr] = TPJ ;
  277.                   vo0++ ;
  278.                   goto endloopt ;
  279.                 } 
  280.  
  281.               for (y = posy + 1;
  282.                    (y < 7) && (d[pos8x + y] == macouleur);
  283.                    y++) continue ;
  284.               if ((y != posy + 1) && (d[pos8x + y] == tacouleur))
  285.                 {
  286.                   flag = TRUE ;
  287.                   d[poscr] = TPJ ;
  288.                   vo0++ ;
  289.                   goto endloopt ;
  290.                 } 
  291.  
  292.               for (y = posy - 1;
  293.                    (y > 0) && (d[pos8x + y] == macouleur);
  294.                    y--) continue ;
  295.               if ((y != posy - 1) && (d[pos8x + y] == tacouleur))
  296.                 {
  297.                   flag = TRUE ;
  298.                   d[poscr] = TPJ ;
  299.                   vo0++ ;
  300.                   goto endloopt ;
  301.                 } 
  302.  
  303.               for (x = posx + 1,  y = posy + 1; 
  304.                    (x < 7) && (y < 7) && (d[(x << 3) + y] == macouleur);
  305.                    x++, y++) continue ;
  306.               if ((x != posx + 1) && (d[(x << 3) + y] == tacouleur))
  307.                 {
  308.                   flag = TRUE ;
  309.                   d[poscr] = TPJ ;
  310.                   vo0++ ;
  311.                   goto endloopt ;
  312.                 }
  313.  
  314.               for (x = posx - 1,  y = posy + 1; 
  315.                    (x > 0) && (y < 7) && (d[(x << 3) + y] == macouleur);
  316.                    x--, y++) continue ;
  317.               if ((x != posx - 1) && (d[(x << 3) + y] == tacouleur))
  318.                 {
  319.                   flag = TRUE ;
  320.                   d[poscr] = TPJ ;
  321.                   vo0++ ;
  322.                   goto endloopt ;
  323.                 }
  324.  
  325.               for (x = posx + 1,  y = posy - 1; 
  326.                    (x < 7) && (y > 0) && (d[(x << 3) + y] == macouleur);
  327.                    x++, y--) continue ;
  328.               if ((x != posx + 1) && (d[(x << 3) + y] == tacouleur))
  329.                 {
  330.                   flag = TRUE ;
  331.                   d[poscr] = TPJ ;
  332.                   vo0++ ;
  333.                   goto endloopt ;
  334.                 }
  335.  
  336.               for (x = posx - 1,  y = posy - 1; 
  337.                    (x > 0) && (y > 0) && (d[(x << 3) + y] == macouleur) ;
  338.                    x--, y-- ) continue ;
  339.               if ((x != posx - 1) && (d[(x << 3) + y] == tacouleur))
  340.                 {
  341.                   flag = TRUE ;
  342.                   d[poscr] = TPJ ;
  343.                   vo0++ ;
  344.                 }
  345. endloopt: ;
  346.             }
  347.         } 
  348.     }
  349.   return(flag) ;
  350. }
  351.  
  352.  
  353. int
  354. tujouesen(posx, posy, niv)
  355. int posx, posy, niv ;
  356. {
  357.   register int *d ;
  358.   register int x, y, pos8x ;
  359.  
  360.   pos8x = posx << 3 ;
  361.   d = damier[niv] ;
  362.   d[pos8x + posy] = tacouleur ;
  363.  
  364.   for (x = posx + 1;
  365.        (x < 7) && (d[(x << 3) + posy] == macouleur); x++) continue ;
  366.   if ((x != posx + 1) && (d[(x << 3) + posy] == tacouleur))
  367.     {
  368.       for (x = posx + 1; d[(x << 3) + posy] == macouleur; x++)
  369.         d[(x << 3) + posy] = tacouleur ;
  370.     }
  371.  
  372.   for (x = posx - 1;
  373.        (x > 0) && (d[(x << 3) + posy] == macouleur); x--) continue ;
  374.   if ((x != posx - 1) && (d[(x << 3) + posy] == tacouleur))
  375.     {
  376.       for (x = posx - 1; d[(x << 3) + posy] == macouleur; x--)
  377.         d[(x << 3) + posy] = tacouleur ;
  378.     }
  379.  
  380.   for (y = posy + 1;
  381.        (y < 7) && (d[pos8x + y] == macouleur); y++) continue ;
  382.   if ((y != posy + 1) && (d[pos8x + y] == tacouleur))
  383.     {
  384.       for (y = posy + 1; d[pos8x + y] == macouleur; y++)
  385.         d[pos8x + y] = tacouleur ;
  386.     }
  387.  
  388.   for (y = posy - 1;
  389.        (y > 0) && (d[pos8x + y] == macouleur); y--) continue ;
  390.   if ((y != posy - 1) && (d[pos8x + y] == tacouleur))
  391.     {
  392.       for (y = posy - 1; d[pos8x + y] == macouleur; y--)
  393.         d[pos8x + y] = tacouleur ;
  394.     }
  395.  
  396.   for (x = posx + 1, y = posy + 1;
  397.        (x < 7) && (y < 7) && (d[(x << 3) + y] == macouleur);
  398.        x++, y++) continue ;
  399.   if ((x != posx + 1) && (d[(x << 3) + y] == tacouleur))
  400.     {
  401.       for (x = posx + 1, y = posy + 1; d[(x << 3) + y] == macouleur; x++, y++)
  402.         d[(x << 3) + y] = tacouleur ;
  403.     }
  404.  
  405.   for (x = posx - 1, y = posy + 1;
  406.        (x > 0) && (y < 7) && (d[(x << 3) + y] == macouleur);
  407.        x--, y++) continue ;
  408.   if ((x != posx - 1) && (d[(x << 3) + y] == tacouleur))
  409.     {
  410.       for (x = posx - 1, y = posy + 1; d[(x << 3) + y] == macouleur; x--, y++)
  411.         d[(x << 3) + y] = tacouleur ;
  412.     }
  413.  
  414.   for (x = posx + 1, y = posy - 1;
  415.        (x < 7) && (y > 0) && (d[(x << 3) + y] == macouleur);
  416.        x++, y--) continue ;
  417.   if ((x != posx + 1) && (d[(x << 3) + y] == tacouleur))
  418.     {
  419.       for (x = posx + 1, y = posy - 1; d[(x << 3) + y] == macouleur; x++, y--)
  420.         d[(x << 3) + y] = tacouleur ;
  421.     }
  422.  
  423.   for (x = posx - 1, y = posy - 1;
  424.        (x > 0) && (y > 0) && (d[(x << 3) + y] == macouleur);
  425.        x--, y--) continue ;
  426.   if ((x != posx - 1) && (d[(x << 3) + y] == tacouleur))
  427.     {
  428.       for (x = posx - 1, y = posy - 1; d[(x << 3) + y] == macouleur; x--, y--)
  429.         d[(x << 3) + y] = tacouleur ;
  430.     }
  431. }
  432.